<?php
class PromocionesModel extends Zwei_Db_TableLoggeable
{
	protected $_name = "promociones";
	protected $_name_bolsas = "bolsas";
	protected $_name_bolsa_promociones = "bolsa_promociones";
	protected $_primary = "id_promo";
	protected $_data_bolsa;
	protected $_data_usuarios;
    protected $_data_mensajes;	
    protected $_adapter = "dn";

	public function select()
	{
		$this->setAdapter("dn");
		$select = new Zend_Db_Table_Select($this);
		$select->setIntegrityCheck(false);
		
		$select->from($this->_name, array
		    (
			    'id_promo', 
			    'recurrencia', 
	            'vigencia',
	            'expiracion', 
	            'costo',
	            'cod_tasacion',
	            'cod_tasacion_rec',
	            'limite_recurrencia',
	            'tipo_cliente',
	            'cobro_hib',
	            'num_max_compra',
	            'abono',
	            'descripcion',
	            'usuario',
	            'notifica',
	            'cod_servicio',
	            'envia_sms',
	            'concepto_fact',
	            'bolsa_sms' => new Zend_Db_Expr("
	                   (SELECT `bolsas`.`id_bolsa` FROM `bolsas`
                            LEFT JOIN `bolsa_promociones` ON bolsas.id_bolsa=bolsa_promociones.id_bolsa 
                            WHERE bolsa_promociones.id_promo = promociones.id_promo AND `bolsas`.`unidad` IN ('SMS_TD', 'SMS_ONNET') LIMIT 1
                       )"
		        ),
                'bolsa_mms' => new Zend_Db_Expr("
                       (SELECT `bolsas`.`id_bolsa` FROM `bolsas`
                            LEFT JOIN `bolsa_promociones` ON bolsas.id_bolsa=bolsa_promociones.id_bolsa 
                            WHERE bolsa_promociones.id_promo = promociones.id_promo AND `bolsas`.`unidad` IN ('MMS_TD', 'MMS_ONNET') LIMIT 1
                       )"
                ),
                'bolsa_min' => new Zend_Db_Expr("
                       (SELECT `bolsas`.`id_bolsa` FROM `bolsas`
                            LEFT JOIN `bolsa_promociones` ON bolsas.id_bolsa=bolsa_promociones.id_bolsa 
                            WHERE bolsa_promociones.id_promo = promociones.id_promo AND `bolsas`.`unidad` = 'MIN' LIMIT 1
                       )"
                ),
                'bolsa_gprs' => new Zend_Db_Expr("
                       (SELECT `bolsas`.`id_bolsa` FROM `bolsas`
                            LEFT JOIN `bolsa_promociones` ON bolsas.id_bolsa=bolsa_promociones.id_bolsa 
                            WHERE bolsa_promociones.id_promo = promociones.id_promo AND `bolsas`.`unidad` IN ('KB', 'BAM_KB', 'BAM_HH', 'NEM_KB', 'NEM_HH') LIMIT 1
                       )"
                ),
                'bolsa_spinvox' => new Zend_Db_Expr("
                       (SELECT `bolsas`.`id_bolsa` FROM `bolsas`
                            LEFT JOIN `bolsa_promociones` ON bolsas.id_bolsa=bolsa_promociones.id_bolsa 
                            WHERE bolsa_promociones.id_promo = promociones.id_promo AND `bolsas`.`unidad` IN ('SPINVOX', 'SPINVOXNOR') LIMIT 1
                       )"
                ),
                'bolsa_movitalk' => new Zend_Db_Expr("
                       (SELECT `bolsas`.`id_bolsa` FROM `bolsas`
                            LEFT JOIN `bolsa_promociones` ON bolsas.id_bolsa=bolsa_promociones.id_bolsa 
                            WHERE bolsa_promociones.id_promo = promociones.id_promo AND `bolsas`.`unidad` = 'MOVITALK' LIMIT 1
                       )"
                ),
                'bolsa_nfmins' => new Zend_Db_Expr("
                       (SELECT `bolsas`.`id_bolsa` FROM `bolsas`
                            LEFT JOIN `bolsa_promociones` ON bolsas.id_bolsa=bolsa_promociones.id_bolsa 
                            WHERE bolsa_promociones.id_promo = promociones.id_promo AND `bolsas`.`unidad` = 'NFMINS' LIMIT 1
                       )"
                ),
                'bolsa_nfdias' => new Zend_Db_Expr("
                       (SELECT `bolsas`.`id_bolsa` FROM `bolsas`
                            LEFT JOIN `bolsa_promociones` ON bolsas.id_bolsa=bolsa_promociones.id_bolsa 
                            WHERE bolsa_promociones.id_promo = promociones.id_promo AND `bolsas`.`unidad` = 'NFDIAS' LIMIT 1
                       )"
                ),
                'bolsa_categoria' => new Zend_Db_Expr("
                       (SELECT `bolsas`.`id_bolsa` FROM `bolsas`
                            LEFT JOIN `bolsa_promociones` ON bolsas.id_bolsa=bolsa_promociones.id_bolsa 
                            WHERE bolsa_promociones.id_promo = promociones.id_promo AND `bolsas`.`unidad` = 'PASO' LIMIT 1
                       )"
                )                
		    )
	    )
        ->order("$this->_name.id_promo");
		return $select;
	}
	
	public function overloadDataTabs($data)
	{
	    $this->setAdapter("dn");
		//$data = $this->overloadBolsas($data);
		$data = $data->toArray();
	    
		$i = 0;
        foreach ($data as $v) {
            $select = $this->selectUsuarios($v['id_promo']);
            Debug::writeBySettings($select->__toString(), "query_log");
            Debug::writeBySettings($this->getAdapter()->getConfig(), "query_log");
            $usuarios = $this->fetchAll($select);

            foreach ($usuarios as $row) {
                $data[$i]["promousuario_{$row->usuario}"] = "1";
            }
            
            $data[$i]['txt_exito'] = '';
            $data[$i]['txt_error'] = '';
            $data[$i]['txt_sin_saldo'] = '';
            
            $select = $this->selectMensajesTexto($v['id_promo']);
            Debug::writeBySettings($select->__toString(), "query_log");
            $mensajes = $this->fetchAll($select);
            
            if ($mensajes->count() > 0)
            {
                $row = $mensajes[0];
                $data[$i]['txt_exito'] = $row->txt_exito;
                $data[$i]['txt_error'] = $row->txt_error;
                $data[$i]['txt_sin_saldo'] = $row->txt_sin_saldo;
            }   		
		    $i++;
        }
        return $data;
	}
	
	//[DELETE ME] Se deprecó al optimizar $this->select()
	public function overloadBolsas($data)
	{
	    $this->setAdapter("dn");
		$data = $data->toArray();
		
		$i = 0;
		foreach ($data as $v) {
			$select = $this->selectBolsas($v['id_promo']);
			Debug::writeBySettings($select->__toString(), "query_log");
            Debug::writeBySettings($this->getAdapter()->getConfig(), "query_log");
			$bolsas = $this->fetchAll($select);
			
            $data[$i]['bolsa_sms'] = "";
            $data[$i]['bolsa_mms'] = "";
            $data[$i]['bolsa_min'] = "";
            $data[$i]['bolsa_gprs'] = "";
            $data[$i]['bolsa_spinvox'] = "";
            $data[$i]['bolsa_movitalk'] = "";
            $data[$i]['bolsa_nfmins'] = "";
            $data[$i]['bolsa_nfdias'] = "";
            $data[$i]['bolsa_categoria'] = "";			

			foreach ($bolsas as $row) {
	            if (in_array($row->unidad, array('SMS_TD', 'SMS_ONNET'))) $data[$i]['bolsa_sms'] = $row->id_bolsa;
	            if (in_array($row->unidad, array('MMS_TD', 'MMS_ONNET'))) $data[$i]['bolsa_mms'] = $row->id_bolsa;
	            if ($row->unidad == 'MIN') $data[$i]['bolsa_min'] = $row->id_bolsa;
	            if (in_array($row->unidad, array('KB', 'BAM_KB', 'BAM_HH', 'NEM_KB', 'NEM_HH'))) $data[$i]['bolsa_gprs'] = $row->id_bolsa;
	            if (in_array($row->unidad, array('SPINVOX', 'SPINVOXNOR'))) $data[$i]['bolsa_spinvox'] =  $row->id_bolsa;
	            if ($row->unidad == 'MOVITALK') $data[$i]['bolsa_movitalk'] = $row->id_bolsa;
	            if ($row->unidad == 'NFMINS') $data[$i]['bolsa_nfmins'] = $row->id_bolsa;
	            if ($row->unidad == 'NFDIAS') $data[$i]['bolsa_nfdias'] = $row->id_bolsa;
	            if ($row->unidad == 'PASO') $data[$i]['bolsa_categoria'] = $row->id_bolsa;
			}
			$i++;
		}
		return $data;
	}
	
	
    public function selectBolsas($id_promo) 
    {
        $select = new Zend_Db_Table_Select($this);
        $select->setIntegrityCheck(false);
        $select
            ->from($this->_name_bolsas, array('unidad', 'id_bolsa'))
            ->joinLeft($this->_name_bolsa_promociones,"$this->_name_bolsas.id_bolsa=$this->_name_bolsa_promociones.id_bolsa", array())
            ->where("$this->_name_bolsa_promociones.id_promo =  ?", $id_promo);
        return $select;
    }
    
    public function selectUsuarios($id_promo)
    {
    	$model = new UsuarioPromocionesModel();
        $select = $model->select('usuario')
            ->where('id_promo = ?', $id_promo);
        return $select;    
    }
    
    public function selectMensajesTexto($id_promo)
    {
    	$mensaje = new TextoPromocionesModel();
    	$select = $mensaje->select()
    	   ->where("id_promo = ?", $id_promo);
    	return $select;   
    }
    
	
    public function cleanDataParams($data)
    {
    	//Usuarios
    	foreach ($data as $i => $v) {
    		if (preg_match("/^promousuario_(.*)/", $i, $matches)) {
    			//$data['nombreusuario'] = 'nombre_usuario';
    			if ($v == '1') $this->_data_usuarios[$matches[1]] = $matches[1];
    			unset($data[$i]);
    		}
    	}
    	
    	//Bolsas
        $this->_data_bolsa["bolsa_sms"] = $data["bolsa_sms"];
        unset($data["bolsa_sms"]);
        
        $this->_data_bolsa["bolsa_mms"] = $data["bolsa_mms"];
        unset($data["bolsa_mms"]);
        
        $this->_data_bolsa["bolsa_min"] = $data["bolsa_min"];
        unset($data["bolsa_min"]);
        
        $this->_data_bolsa["bolsa_gprs"] = $data["bolsa_gprs"];
        unset($data["bolsa_gprs"]);
        
        $this->_data_bolsa["bolsa_spinvox"] = $data["bolsa_spinvox"];
        unset($data["bolsa_spinvox"]);
        
        $this->_data_bolsa["bolsa_movitalk"] = $data["bolsa_movitalk"];
        unset($data["bolsa_movitalk"]);
        
        $this->_data_bolsa["bolsa_nfmins"] = $data["bolsa_nfmins"];
        unset($data["bolsa_nfmins"]);
        
        $this->_data_bolsa["bolsa_nfdias"] = $data["bolsa_nfdias"];
        unset($data["bolsa_nfdias"]);
        
    
        //Mensajes        
        $this->_data_mensajes["txt_exito"] = $data["txt_exito"];
        unset($data["txt_exito"]);
        
        $this->_data_mensajes["txt_error"] = $data["txt_error"];
        unset($data["txt_error"]);
        
        $this->_data_mensajes["txt_sin_saldo"] = $data["txt_sin_saldo"];
        unset($data["txt_sin_saldo"]);       
        
        return $data;
    }
    
	public function addBolsasPromociones($id_promo)
	{
	    //$bolsa = new BolsasModel();
        $bolsaPromociones = new BolsaPromocionesModel();
        $bolsaPromociones->getAdapter()->getProfiler()->setEnabled(true);
        $bolsaPromociones->delete(array('id_promo = ?' => $id_promo));
        
        if (is_object($bolsaPromociones->getAdapter()->getProfiler()->getLastQueryProfile())) {
            $query = $bolsaPromociones->getAdapter()->getProfiler()->getLastQueryProfile()->getQuery();
            $query_params = print_r($bolsaPromociones->getAdapter()->getProfiler()->getLastQueryProfile()->getQueryParams(),true);
            $this->getAdapter()->getProfiler()->setEnabled(false);
            Zwei_Utils_Debug::write("[TRANSACTION:{$bolsaPromociones->_form->action}]\nUser:{$bolsaPromociones->_user_info->user_name}\nQuery:$query\nQuery Params:$query_params",  "../log/transactions");
        } else {
            $log_where = print_r("id promo:$id_promo", true);
            Zwei_Utils_Debug::write("Se modificó bolsaPromociones TRANSACTION:modificar \nUser:{$this->_user_info->user_name}  \nWhere:$log_where", "../log/transactions");
        }
        
        $return = false;
        
        foreach ($this->_data_bolsa as $v) {
        	if (!empty($v)) {
	           try { 
	               if ($bolsaPromociones->insert(array("id_promo" => $id_promo, "id_bolsa" => $v))) $return = true;
	           } catch (Zend_Db_Exception $e) {
	           	   if ($e->getCode() != '23000') Debug::write($e->getMessage()." ".$e->getCode());
	           }
            
	           //$query = $bolsaPromociones->getAdapter()->getProfiler()->getLastQueryProfile()->getQuery();
               //$query_params = print_r($bolsaPromociones->getAdapter()->getProfiler()->getLastQueryProfile()->getQueryParams(),true);
               //Zwei_Utils_Debug::write("[TRANSACTION:add]\nQuery:$query\nQuery Params:$query_params",  "../log/transactions");   
        	}
        }
        
        return $return;
	}
    
	public function addTextosPromociones($id_promo)
	{
		$textosPromociones = new TextoPromocionesModel();
		$textosPromociones->delete(array('id_promo = ?' => (int) $id_promo));
		$return = false;
        foreach ($this->_data_mensajes as $i => $v) {
        	try {
                if ($textosPromociones->insert(array("id_promo"=>$id_promo, $i=>$v))) $return = true;
            } catch(Zend_Db_Exception $e) {
                if ($textosPromociones->update(array($i=>$v), array('id_promo = ?' => (int) $id_promo)));
            }    
        }
        return $return;
	}
	
	
	public function addUsuariosPromociones($id_promo)
	{
		$usuarioPromociones = new UsuarioPromocionesModel();
		$usuarioPromociones->getAdapter()->getProfiler()->setEnabled(true);
		$usuarioPromociones->delete(array('id_promo = ?' => (int) $id_promo));
		$return = false;
		if (!empty($this->_data_usuarios)) {
		    foreach ($this->_data_usuarios as $i => $v) {
	            if ($usuarioPromociones->insert(array("id_promo"=>$id_promo, "usuario"=>$v))) $return = true;
	            //$query = $usuarioPromociones->getAdapter()->getProfiler()->getLastQueryProfile()->getQuery();
                //$query_params = print_r($usuarioPromociones->getAdapter()->getProfiler()->getLastQueryProfile()->getQueryParams(),true);
                //Zwei_Utils_Debug::write("[TRANSACTION:add]\nQuery:$query\nQuery Params:$query_params",  "../log/transactions");   
	        }
		}
		$usuarioPromociones->getAdapter()->getProfiler()->setEnabled(false);    
        return $return;
	}
	
	public function delete($where) {
		$this->setAdapter("an");
		
		$usuarioPromociones = new UsuarioPromocionesModel(); 
        $usuarioPromociones->delete($where);
        
        $textoPromociones = new TextoPromocionesModel(); 
        $textoPromociones->delete($where);
        
        $bolsaPromociones = new BolsaPromocionesModel();
        $bolsaPromociones->delete($where);
        
		return parent::delete($where);
	}
	
    
	public function update($data, $where) 
	{
        $this->setAdapter("an");
        Debug::write($this->getAdapter()->getConfig());        
        		
		if (empty($data["concepto_fact"])) {
			unset($data["concepto_fact"]);
			unset($data["abono"]);
		}
		
		$array = $this->whereToArray($where);
		$id_promo = $array[1];//$id_promo = $array["id_promo"]
		$id_promo = str_replace("'", "", $id_promo);
		
		$data = $this->cleanDataParams($data);
		
        try {
        	$update = parent::update($data, $where);
        	Debug::write($this->getAdapter()->getConfig());
		} catch (Zend_Db_Exception $e) {
            if ($e->getCode() == 23000) {
                $this->setMessage("El id de promoción ya existe");
            } else {
                Debug::write($e->getCode()." ".$e->getMessage());
            }
            return false;
        }    
		
		$ins_bolsas = $this->addBolsasPromociones($id_promo);
		$ins_promociones = $this->addUsuariosPromociones($id_promo);
		$ins_mensajes = $this->addTextosPromociones($id_promo);
		
		//Buscamos cualquier modificación para retornar != false
		if (!$update && $ins_bolsas) $update = $ins_bolsas;
		if (!$update && $ins_mensajes) $update = $ins_mensajes; 
		if (!$update) $update = $ins_promociones; 
		
		return $update;
	}
	
    public function insert($data) 
    {
        $this->setAdapter("an");
            	
        if (empty($data["concepto_fact"])) {
            unset($data["concepto_fact"]);
            unset($data["abono"]);
        }

        $data = $this->cleanDataParams($data);        
        
        try {
            $last_insert_id = parent::insert($data);
        } catch (Zend_Db_Exception $e) {
        	if ($e->getCode() == 23000) {
        		$this->setMessage("El id de promoción ya existe");
        	} else {
        		Debug::write($e->getCode()." ".$e->getMessage());
        	} 
        	return false;
        }    
        
        $ins_bolsas = $this->addBolsasPromociones($last_insert_id);
        $ins_promociones = $this->addUsuariosPromociones($last_insert_id);
        $ins_mensajes = $this->addTextosPromociones($last_insert_id);
        
        return $last_insert_id;
        
    }
    
    public function getEditValidation()
    {

    	return "
    try {	
	    var pfx = (global_opc == 'edit' || global_opc == 'clone') ? '' : '_add'; 
	    var data = dijit.byId('tabForm').get('value');
	    console.debug(data);
	    
 	    try {
		    var recurrencia = data['recurrencia[0]'];
		    var vigencia = data['vigencia[0]'];
		
		    var cod_tasacion_rec = data['cod_tasacion_rec[0]'];
		    var limite_recurrencia = data['limite_recurrencia[0]'];
		    var num_max_compra = data['num_max_compra[0]'];
		    var tipo_cliente = data['tipo_cliente[0]'];

            var bolsa_sms = data['bolsa_sms[0]'];;
            var bolsa_mms = data['bolsa_mms[0]'];
            var bolsa_min = data['bolsa_min[0]'];
            var bolsa_gprs = data['bolsa_gprs[0]'];
            var bolsa_spinvox = data['bolsa_gprs[0]'];
            var bolsa_movitalk = data['bolsa_movitalk[0]'];
            var bolsa_nfmins = data['bolsa_nfmins[0]'];
            var bolsa_nfdias =data['bolsa_nfdias[0]'];
		} catch (e) {
           console.debug(e);
		}
	    
	    var cod_servicio = data['cod_servicio[0]'];
	    var notifica = data['notifica[0]'];
	    var envia_sms = data['envia_sms[0]'];
	    var concepto_fact = data['concepto_fact[0]'];
	    var patron = /^\d{1,10}$/;
	
	
	    if (vigencia <=0 || vigencia >=1000)
	    {
	        alert('La Vigencia debe ser un numero entre 1 y 1000');
	        return false;
	    }
	
	    else if((parseInt(recurrencia) === 1 || parseInt(recurrencia) === 2 ) && cod_tasacion_rec == '' )
	    {
	        alert('Debes ingresar un Codigo de Tasacion de Recurrencia para la promocion');
	        return false;
	    }
	    else if( parseInt(recurrencia) === 2 )
	    {
		    if( limite_recurrencia == '' )
		    {
		        alert('Debes ingresar un limite maximo de recurrencia');
		        return false;
		    }
		    else if( limite_recurrencia != '' )
		    {
		        if(limite_recurrencia < 1 || limite_recurrencia >= 1000)
		        {
		                alert('El limite de recurrencia debe ser un numero mayor a 0');
		                return false;
		        }
		    }
		}    
	
	    else if (bolsa_sms == '' && bolsa_mms == '' && bolsa_min == '' && bolsa_gprs == '' && bolsa_spinvox == '' && bolsa_movitalk == '' && bolsa_nfmins == '' && bolsa_nfdias == '' )
	    {
	        alert('Debes elegir al menos una Bolsa para la promocion');
	        return false;
	    }
	
	
	    if( cod_servicio == '' && bolsa_min != '' && (tipoCliente == 'C' || tipoCliente == 'T') )
	    {
	        alert('Debes ingresar un codigo de servicio');
	        return false;
	    }
	    if( !concepto_fact.match(patron) && (tipoCliente == 'H' || tipoCliente == 'T') )
	    {
	            alert('Debes ingresar un codigo de concepto facturable');
	            return false;
	    }
	

	} catch (e) {
        console.debug(e);
	}
	  	";
    	
    }	
}